package main

import (
	"bufio"
	"fmt"
	"io"
	"io/ioutil"
	"os"
	"strconv"
)

// onlyRead
func onlyRead(path string) {
	// 只读模式打开文件
	file, err := os.Open(path)

	if err != nil {
		panic(err)
	}

	// 操作只读
	// 打印 file 对象
	fmt.Println(file)

	// 读 1
	buf := make([]byte, 5)
	var strSlice []byte
	for {
		n, err := file.Read(buf)
		if err != nil {
			fmt.Println("读空了")
			break
		}
		if err == io.EOF {
			break
		}
		strSlice = append(strSlice, buf[:n]...)
		fmt.Println(string(strSlice))
	}
	defer file.Close()
}

// bufio
func bufioRead(path string) {
	file, err := os.Open(path)

	if err != nil {
		fmt.Println(err)
		return
	}

	defer file.Close()
	reader := bufio.NewReader(file)
	var res string
	for {
		str, err := reader.ReadString('\n')
		if err == io.EOF {
			res += str
			break
		}
		if err != nil {
			fmt.Println(err)
			return
		}

		res += str
	}
	fmt.Println(res)
}

// ioutil 读取  go 1.16之后 ioutil被废弃， 不在更新写文件操作
func ioutilRead(path string) {
	// ioutil包 go 1.16之后被废弃
	byteStr, err := ioutil.ReadFile(path)
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println(string(byteStr))
}

func onlyWrite(path string) {
	// os.O_TRUNC == > 清空文件
	// os.O_APPEND ==> 追加
	file, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0666)
	if err != nil {
		fmt.Println(err)
		return
	}
	defer file.Close()
	for i := 0; i < 10; i++ {
		file.WriteString("??" + strconv.Itoa(i) + "\r\n")
	}
	fmt.Println("写入成功")
}

func bufioWrite(path string) {
	file, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0666)
	if err != nil {
		fmt.Println(err)
		return
	}
	defer file.Close()
	writer := bufio.NewWriter(file)
	writer.WriteString("1234567890\r\n")
	writer.Flush()
}

// 文件opt

// 文件复制 1
func copyFile(src, dst string) (err error) {
	origin, err1 := os.Open(src)
	dest, err2 := os.OpenFile(dst, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0666)
	if err1 != nil {
		return err1
	}
	if err2 != nil {
		return err2
	}
	var tmpSlice = make([]byte, 100)

	for {
		n1, err := origin.Read(tmpSlice)
		if err == io.EOF {
			break
		}
		if err != nil {
			return err
		}

		if _, err := dest.Write(tmpSlice[:n1]); err != nil {
			return err
		}
	}
	origin.Close()
	dest.Close()
	return nil
}
func main() {
	// onlyRead("./text.txt")
	// // bufio 读文件
	// fmt.Println("=====================")
	// bufioRead("./text.txt")
	// fmt.Println("=====================")
	// ioutilRead("./text.txt")
	// onlyWrite("./text.txt")
	// bufioWrite("./text.txt")
	copyFile("./text.txt", "./text2.txt")

	// 创建目录
	os.Mkdir("./test", 0777)

	// 删除目录
	os.Remove("./test")

	// 创建多级目录 == > recursion
	os.MkdirAll("./test/test1", 0777)

	// 删除多级目录
	os.RemoveAll("./test")

	// 重命名
	os.Rename("./text2.txt", "./text3.txt")
}
